package com.marketing.tenant.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.marketing.tenant.entity.SubscriptionPlan;

import java.util.List;

/**
 * 订阅计划服务接口
 * 
 * @author Marketing System
 * @since 2024-09-25
 */
public interface SubscriptionPlanService {
    
    /**
     * 创建订阅计划
     * 
     * @param plan 订阅计划
     * @return 创建是否成功
     */
    boolean createPlan(SubscriptionPlan plan);
    
    /**
     * 更新订阅计划
     * 
     * @param plan 订阅计划
     * @return 更新是否成功
     */
    boolean updatePlan(SubscriptionPlan plan);
    
    /**
     * 删除订阅计划（软删除）
     * 
     * @param planId 计划ID
     * @return 删除是否成功
     */
    boolean deletePlan(Long planId);
    
    /**
     * 根据ID获取订阅计划
     * 
     * @param planId 计划ID
     * @return 订阅计划
     */
    SubscriptionPlan getPlanById(Long planId);
    
    /**
     * 根据名称获取订阅计划
     * 
     * @param planName 计划名称
     * @return 订阅计划
     */
    SubscriptionPlan getPlanByName(String planName);
    
    /**
     * 分页查询可用的订阅计划
     * 
     * @param page 分页参数
     * @return 分页结果
     */
    IPage<SubscriptionPlan> getActivePlans(Page<SubscriptionPlan> page);
    
    /**
     * 获取所有可用的订阅计划
     * 
     * @return 计划列表
     */
    List<SubscriptionPlan> getAllActivePlans();
    
    /**
     * 根据价格范围查询订阅计划
     * 
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @return 计划列表
     */
    List<SubscriptionPlan> getPlansByPriceRange(Double minPrice, Double maxPrice);
    
    /**
     * 根据功能模块查询订阅计划
     * 
     * @param feature 功能模块
     * @return 计划列表
     */
    List<SubscriptionPlan> getPlansByFeature(String feature);
    
    /**
     * 获取推荐的订阅计划
     * 
     * @return 推荐计划列表
     */
    List<SubscriptionPlan> getRecommendedPlans();
    
    /**
     * 启用订阅计划
     * 
     * @param planId 计划ID
     * @return 操作是否成功
     */
    boolean enablePlan(Long planId);
    
    /**
     * 禁用订阅计划
     * 
     * @param planId 计划ID
     * @return 操作是否成功
     */
    boolean disablePlan(Long planId);
    
    /**
     * 设置推荐计划
     * 
     * @param planId 计划ID
     * @param recommended 是否推荐
     * @return 操作是否成功
     */
    boolean setRecommended(Long planId, boolean recommended);
}